﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include <string>
#include <vector>
#include "OwnerPtr.h"
#include "GcmpSkpInterface.h"

namespace gcmp
{
    class IBody;
    class IGraphicsNodeGroup;
    class IDocument;

    /// \brief 数据转换成功与否的返回信息
    enum class ImportDataReturnInfo : int32_t
    {
        LicenseError = 0,            ///< 许可证问题
        Success = 1,                     ///< 转换成功
        AllFailure = 2,                  ///< 全部body转换失败
        PartialFailure = 3,              ///< 部分body转换失败
        NoBody = 4,                      ///< 外部格式的body由线和点组成，没有体或壳
        Others = 5                       ///< 其他未知问题
    };

    /// \brief SAT、3DM文件导入
    ///
    class GCMP_SKP_INTERFACE_EXPORT ImportUtils final
    {
    public:
        /// \brief 构造导出sat的静态方法
        ///
        /// \param strFileName sat文件的路径名称字符串
        /// \param bodyList  读得结果的体的集合
        /// \param maxDisEpsilon  允许输出体的最大容差，当转换出的体的容差大于此值时，则认为该体转换出来不合要求，置为空指针
        /// \return std::vector<ImportDataReturnInfo>返回转换信息
        static std::vector<ImportDataReturnInfo> ParseSat(const std::wstring& strFileName, std::vector<OwnerPtr<IBody>> &bodyList, double maxDisEpsilon = 0.01f);

        /// \brief   构造导出3dm的静态方法，读3dm文件，将3dm文件的body转化成GGP的body
        ///
        /// \param the3DMFileName  3dm文件的路径名称字符串
        /// \param bodyList  读得结果的体的集合
        /// \param maxDisEpsilon  允许输出体的最大容差，当转换出的体的容差大于此值时，则认为该体转换出来不合要求，释放并置为空指针
        /// \return std::vector<ImportDataReturnInfo>返回转换信息
        static std::vector<ImportDataReturnInfo> Parse3DM(const std::wstring& the3DMFileName, std::vector <OwnerPtr<IBody>>& bodyList, double maxDisEpsilon = 0.01f);

        /// \brief 加载OBJ模型
        ///
        /// \param pDocument 当前文档
        /// \param filePath obj模型文件路径
        /// \return 返回图形节点组
        static gcmp::OwnerPtr<gcmp::IGraphicsNodeGroup> LoadObjModel(gcmp::IDocument* pDocument, const std::wstring& filePath);
    };

}
